package com.lsnu.ehr.jpa;

import java.util.List;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import com.lsnu.ehr.entity.Emp;

// JpaRepository jpa操作接口，定义了常用的增删查改方法
// 泛型<Emp, Long> 指定操作类和类的主键类型
// JpaRepository 接口不需要实现就可以对实体类进行增删查改
// springjpa 框架会代理接口方法进行实现

public interface EmpRepository extends JpaRepository<Emp, Long>,JpaSpecificationExecutor<Emp> {
	/**
	 * 根据部门id查询岗位下的员工！
	 * @param id
	 * @return
	 */
	@Query(value = "SELECT * FROM t_emp INNER JOIN t_post ON t_emp.emp_post_id = t_post.id where t_post.id=?1", nativeQuery = true)
	List<Emp> findEmpPostById(Long id);
	
	/**
	 * 根据部门名查询部门下的员工
	 * @param depaName
	 * @return
	 */
	@Query(value = "SELECT * FROM t_emp INNER JOIN t_depa ON t_emp.emp_div_id = t_depa.id where t_depa.depa_name=?1 limit ?2,?3", nativeQuery = true)
	List<Emp> findByDepaName(String depaName, Integer page, Integer pageLeng);
	/**
	 * 根据部门名查询部门下的员工数量
	 * @param depaName
	 * @return
	 */
	@Query(value = "SELECT count(*) FROM t_emp INNER JOIN t_depa ON t_emp.emp_div_id = t_depa.id where t_depa.depa_name=?1", nativeQuery = true)
	Long findByDepaNameCount(String depaName);
	
	/**
	 * 根据岗位名查询部门下的员工
	 * @param depaName
	 * @return
	 */
	@Query(value = "SELECT * FROM t_emp INNER JOIN t_post ON t_emp.emp_post_id = t_post.id where t_post.post_name=?1 limit ?2,?3", nativeQuery = true)
	List<Emp> findByPostName(String postName, Integer page, Integer pageLeng);
	
	@Query(value = "SELECT count(*) FROM t_emp INNER JOIN t_post ON t_emp.emp_post_id = t_post.id where t_post.post_name=?1", nativeQuery = true)
	Long findByPostNameCount(String postName);
	
	/**
	 * 根据部门id查询部门下的员工！
	 * @param id
	 * @return
	 */
	@Query(value = "SELECT * FROM t_emp INNER JOIN t_depa ON t_emp.emp_div_id = t_depa.id where t_depa.id=?1", nativeQuery = true)
	List<Emp> findEmpDepaById(Long id);
	/**
	 * 查询 合法员工 并分页和排序
	 * 利用JpaSpecificationExecutor接口来进行简单的分页查询
	 * @return
	 */
	List<Emp> findByAvailableTrue(Pageable page);
	/**
	 * 根据员工姓名进行模糊查询
	 * @param name
	 * @return
	 */
	List<Emp> findByEmpNameLike(Pageable page, String name);
	/**
	 * 根据员工姓名进行模糊查询的条数
	 * @param name
	 * @return
	 */
	@Query(value = "SELECT count(*) FROM t_emp where emp_name=?1", nativeQuery = true)
	Long findByEmpNameLikeCount(String name);
	
	/**
	 * 根据入职时间区域对员工进行查询进行查询
	 * @param beginDate  开始时间
	 * @param endDate	末尾时间
	 * @param page		当前页数
	 * @param pageLength	一页最大显示数
	 * @return
	 */
	@Query(value = "select * from t_emp where t_emp.emp_entry_date>=?1 and t_emp.emp_entry_date<?2 limit ?3,?4", nativeQuery = true)
	List<Emp> findEmpByDate(String beginDate, String endDate, Integer page, Integer pageLength);
	@Query(value = "select count(*) from t_emp where t_emp.emp_entry_date>=?1 and t_emp.emp_entry_date<?2", nativeQuery = true)
	Long findEmpByDateCount(String beginDate, String endDate);
	
}
